home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
graphics
/
chs_ultd.lzh
/
CHS_ULTD.500
/
ANLEITNG
/
CHAOS_2.TXT
< prev
Wrap
Text File
|
1992-09-27
|
50KB
|
1,316 lines
Teil V
Dateiformate
An sich sollte es selbstverständlich sein, dass eine Programmdokumentation auch eine Be-
schreibung der verwendeten Dateiformate enthält. Wie so vieles ist es das nicht, was mich
aber nicht hindern soll, hier mit gutem Beispiel voranzugehen.
1 CHAOSultd-Bilder
CHAOSultd verwendet für Bilder ein eigenes Format34
Eine Bilddatei besteht aus einem Header, der Farbtabelle, den Parametern, zusätzlichen
Parametern und den Bilddaten, wobei letztere immer gepackt werden, auch dann, wenn sie
dadurch länger werden35.
Der Header sieht (als C-Struktur) folgendermassen aus:
typedef struct
-
/* id's */
char chaos_id[8]; /* CHSultd5 */
char frac_id[8];
/* grösse, planes und colors */
unsigned int size_x;
unsigned int size_y;
unsigned int planes;
unsigned int colors;
/* zus. parameter */
int lastline;
int last_flag;
int xor_offset;
/* länge der folgenden daten */
long par_len;
long xpar_len;
long pic_len;
/* coltab in long */
/* parameter */
/* zus. parameter */
/* bilddaten */
" FRAC_HEAD;
chaos_id ist eine Kennung, die die Zeichen CHSultd5 beinhalten muss. frac_id ist eine wei-
tere Kennung, die die Berechnungsroutine, die für das Bild verantwortlich ist, kennzeichnet.
____________________________________34
Wozu Standartformate verwenden, wenn man auch eigene definieren kann?
Aber im Ernst: die verschiedenen Bildgrössen und die Verwaltung der Parameter liessen mir ei*
*n spezielles
Format sinnvoll erscheinen und wenn man sowieso ein eigenes Format verwendet, ist es auch schon*
* egal, wie
speziell dieses Format dann ist (denkbar wäre höchstens noch ein GEM-Image-Format gewesen, mi*
*t einem
erweiterten Header; vielleicht führe ich das mal als alternatives Format ein).
35das ist kein Scherz, das kann wirklich passieren, die Daten werden aber nicht nennenswert l*
*änger
45
size_x, size_y, planes und colors legen die Bildgrösse, die Anzahl der Bitebenen und die
Zahl der Farben fest. Die Bildgrösse ist - unabhängig davon, ob und wieweit das Bild schon
berechnet wurde - die Grösse des fertig berechneten Bildes.
lastline gibt an, ob das Bild fertig ist oder nicht. Ist lastline 0, so gibt es gar keine
Bilddaten, -1 bedeutet, dass das Bild fertig berechnet ist. Andernfalls gibt lastline die
Anzahl der berechneten und gespeicherten Zeilen an, aber nur falls das unterste Bit in
last_flag gesetzt ist36. Ist dieses Bit gelöscht, so ist für lastline6= 0 stets das gesammte
Bild gespeichert.
xor_offset ist für das Packen der Daten von Bedeutung und wird gleich erklärt; par_len,
xpar_len und pic_len gibt die Länge der drei Datenblöcke an. Die Parameter und zus.
Parameter sind natürlich Bildtypabhängig, bleiben also die Bilddaten.
Im Farbmodus werden zunächst die Bitplanes, die im Screen-Format ja wortweise hinter-
einanderstehen getrennt, d.h. es kommt erst die ganze Bitplane 0, dann 1 usw. (man hat
also gewissermassen ein GEM-Standartformat, wobei die Grösse des Blockes durch size_x
und size_y festgelegt ist).
Dann werden die Bilddaten von hinten mit dem xor_offset mit sich selbst via xor ver-
knüpft. Der Offset entspricht im Allgemeinen einer oder mehreren Bildschirmzeilen. Da-
durch entsteht ein Bild, dessen Zeilen (ausser der ersten) immer nur die Differenz zur
darüberliegenden Zeile beinhalten und das deshalb i.a. besser zu packen ist. Ist xor_offset
0 so entfällt die Xor-Verknüpfung. Um die Xor-Verknüpfung beim Laden rückgängig zu
machen muss man die Daten erneut via xor miteinander verknüpfen, diesmal allerdings von
vorne.
Anschliessend werden die Bilddaten im Stad-Format gepackt und gespeichert.
Das heisst die gepackten Daten beginnen mit den drei Bytes Kennbyte, Packbyte und Spe-
zialbyte, anschliessend folgen die gepackten Graphikdaten, wobei folgende Kodierungen An-
wendung finden:
Das Kennbyte und das nachfolgende Byte n bedeuten, dass das Packbyte n+1 mal zusam-
mengefasst wurde.
Das Spezialbyte und die beiden nachfolgenden Bytes a und n bedeuten, dass das Byte a n+1
mal zusammengefasst wurde.
Alle anderen Bytes müssen so wie sie in der Datei stehen in das Bild übernommen werden.
2 Filme
Film-Dateien haben sich gegenüber FRACTAL Version 4.1 (und 4.3) nicht geändert.
Sie bestehen aus dem Header 'film', der (als 2 Byte Integer abgelegten) Anzahl verschie-
dener Bilder sowie der Anzahl der Bilder im Film. Es folgen die Anzeigeoptionen (eine
SHOW_OPTS-Struktur), daran schliessen sich die Informationen über die im Film enthal-
tenen Bilder an. Und zwar für jedes Bild Dateipfad, Name und Dateiextension, jeweils als
nullterminierter String (unter diesen Dateinamen werden die Bilder beim Einladen eines
Filmes gesucht). Deshalb ist es auch nötig, dass die Bilder beim Speichern des Filmes ge-
speichert sind, FRACTAL könnte sonst höchstens raten, wohin man die Bilder abspeichern
wird. Dateipfade können (seit FRACTAL V4.3) relativ sein, sie beginnen dann nicht mit
einem Laufwerk. In diesem Fall ist der Pfad relativ zum Verzeichnis der Filmdatei zu ver-
stehen.
____________________________________36
die anderen Bits sind reserviert
46
Zuletzt folgt eine Liste mit der Reihenfolge der Bilder im Film, wobei sich die Nummern (1
Byte Integer) auf die Reihenfolge der Dateinamen beziehen.
Filmdateien dürfen nicht länger als 32000 Bytes sein.
3 Einstellungen
Die Einstellungsdateien will ich hier nicht im Detail erläutern, da sie sicher nicht sonderlich
interessant sind.
Eventuell doch von Interesse ist allerdings der prinzipielle Aufbau dieser Dateien, die ja
nicht nur die Voreinstellungen von CHAOSultd selbst, sondern auch die der diversen Be-
rechungsroutinen - letztere in nicht festgelegter Reihenfolge und womöglich wechselnder
Anzahl.
Realisiert wird dies durch eine Block-Struktur. Jeder Block beginnt mit einem 12 Byte
langen Header: die ersten 8 Byte erhalten eine Kennung (CHAOSultd verwendet für seine
Einstellungen CHSultd5, für die Berechnungsroutinen wird die gleiche Kennung verwendet
wie in Bilddateien. Es folgt als Langwort (4 Byte) die Länge der folgenden Daten. Ansch-
liessend kommen die Einstellungsdaten sebler, deren Inhalt von den Berechnungsroutinen
abhängt; die CHAOSultd-Einstellungen bestehen aus einer CHS_SET-Struktur, die in der
Headerdatei XCOMMON.H definiert ist.
47
Teil VI
die Schnittstelle für externe Routinen
Die folgenden Erläuterungen sind nur für Programmierer bestimmt, die eigene Berechnungs-
routinen für Bilder irgendeiner Art schreiben wollen.
Aus technischen Gründen ist es nicht ratsam dies in einer anderen Sprache als C37 und
vermutlich auch da wiederum nur in Pure C (bzw. Turbo C) zu versuchen. Wie weit andere
C-Compiler mit den Parameterübergabe-Konventionen von Turbo/Pure C zurecht kommen
weiss ich nicht (vermutlich eher nicht, Turbo/Pure C übergibt Parameter auch in Registern).
Man sei sich auch darüber im Klaren, dass die eigentliche Berechnungsroutine (jedenfalls
solange man sie nicht sehr aufwendig optimiert) meist nur einen kleinen Teil der nötigen
Routinen darstellt, insbesondere sollte man in der Lage sein, mit GEM-Dialogboxen umzu-
gehen. Ich setze im folgenden stets vorraus, dass Interessenten in C programmieren können,
insbesondere den Umgang mit Strukturen beherrschen, ebenso die Programmierung von
GEM-Programmen.
Wie aber werden externe Routinen überhaupt eingebunden? Und welches Format muss die
erzeugte XCH-Datei haben?
Um die zweite Frage zuerst zu beantworten: bei der XCH-Datei handelt es sich um eine
normale Programm-Datei, die aber keinen Startup-Code besitzt. Erzeugen kann man eine
solche Datei mit Pure C, indem man in der Projektdatei einfach den Startup-Code weglässt
(man kann das so erzeugte Programm natürlich nicht vom Desktop aus ausführen).
Das Programm enthält auch keine Funktion main, eingebunden wird es vielmehr so, dass
die erste Funktion der Source-Datei nach dem Laden und Relozieren aufgerufen wi